'use strict';

//引用模块中的属性
let { Sequelize, DataTypes } = require('sequelize');
let { database, role, pws, host, dialect } = require('./config');


// 要连接到数据库,必须创建一个 Sequelize 实例. 
// 这可以通过将连接参数分别传递到 Sequelize 构造函数或通过传递一个连接 URI 来完成：
const sequelize = new Sequelize(database, role, pws, {
    host: host,
    dialect: dialect
});

//创建函数，包装模型
function defineModel(name, attrs) {

    let obj = {};

    //模型id
    obj.id = {
        type: DataTypes.BIGINT,
        primaryKey: true,
        autoIncrement: true
    };

    //将外部创建的列(属性)全部加入到当前模块
    for (let key in attrs) {
        let value = attrs[key];
        obj[key] = value;
    }


    //创建时间
    obj.createdAt = {
        type: DataTypes.BIGINT,
        allowNull: false,
    };

    //更改时间
    obj.updatedAt = {
        type: DataTypes.BIGINT,
        allowNull: false,
    };

    //版本
    obj.version = {
        type: DataTypes.BIGINT,
        allowNull: false,
    };
    //备注
    obj.remarks = {
        type: DataTypes.STRING(800),
        allowNull: true,
    };



    //利用sequelize实例化一个模型
    let models = sequelize.define(name, obj, {
        tableName: name,
        timestamps: false,//不自动创建createdAt、updatedAt这两个字段（或者属性）

        //钩子对象
        hooks: {

            // 生命周期勾子,意思是在，对将要插入或更新到数据库的数据进行验证之前，执行的方法（这里就是在验证数据之前，给createdAt、updatedAt添加指定的值）
            beforeValidate(obj) {

                //获取当前时间戳
                let now = Date.now();

                //如果是第一次插入数据
                if (obj.isNewRecord) {
                    obj.createdAt = now;
                    obj.updatedAt = now;
                    obj.version = 0;
                } else {
                    updatedAt.value = now
                    obj.version += 1;
                }
            }

        }
    });

    //返回实例化后的模型
    return models
}


//创建一个对象将当前模块的属性放入，还有一个defineModel方法
let objMod = {
    sequelize,
    defineModel,
    DataTypes

}

//暴露当前对象的属性
module.exports = objMod;